Programming conventional NAND flash memory may involve applying a sequence of program pulses to the cells of the flash memory, with each program pulse being followed by coarse-level program verification and optional fine-level program verification for the memory cells that are not verified during the coarse-level program verification. Such an approach may increase programming time and have a negative impact on performance.